package com.scheduling.product.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.scheduling.product.dto.OperationDTO;
import com.scheduling.product.entity.Operation;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 * 工序数据访问层
 *
 * @author 开发团队
 * @since 2025-05-29
 */
@Mapper
public interface OperationMapper extends BaseMapper<Operation> {

    /**
     * 根据工艺路线ID查询工序列表
     *
     * @param routeId 工艺路线ID
     * @return 工序列表
     */
    List<OperationDTO> selectOperationsByRouteId(@Param("routeId") String routeId);

    /**
     * 检查工序编号在工艺路线内是否存在
     *
     * @param routeId       工艺路线ID
     * @param operationCode 工序编号
     * @param excludeId     排除的ID（用于更新时检查）
     * @return 存在的数量
     */
    Integer checkOperationCodeExists(@Param("routeId") String routeId,
                                     @Param("operationCode") String operationCode,
                                     @Param("excludeId") String excludeId);

    /**
     * 检查工序序号在工艺路线内是否存在
     *
     * @param routeId    工艺路线ID
     * @param sequenceNo 工序序号
     * @param excludeId  排除的ID（用于更新时检查）
     * @return 存在的数量
     */
    Integer checkSequenceNoExists(@Param("routeId") String routeId,
                                  @Param("sequenceNo") Integer sequenceNo,
                                  @Param("excludeId") String excludeId);

    /**
     * 根据机器类型ID查询工序列表
     *
     * @param machineTypeId 机器类型ID
     * @return 工序列表
     */
    List<Operation> selectByMachineTypeId(@Param("machineTypeId") String machineTypeId);

    /**
     * 根据产品ID查询工艺路线的所有工序（排产专用）
     *
     * @param productId 产品ID
     * @return 工序列表（按sequence_no排序）
     */
    @Select("SELECT o.* FROM operation o " +
            "JOIN process_route pr ON o.route_id = pr.route_id " +
            "WHERE pr.product_id = #{productId} " +
            "ORDER BY o.sequence_no ASC")
    List<Operation> selectOperationsByProductId(@Param("productId") String productId);

    /**
     * 根据机器类型ID查询空闲机器
     *
     * @param machineTypeId 机器类型ID
     * @return 空闲机器ID列表
     */
    @Select("SELECT machine_id FROM machine " +
            "WHERE machine_type_id = #{machineTypeId} " +
            "AND status = '空闲' " +
            "ORDER BY machine_name")
    List<String> selectIdleMachinesByType(@Param("machineTypeId") String machineTypeId);

    /**
     * 检查工序是否被生产任务引用
     *
     * @param operationId 工序ID
     * @return 引用数量
     */
    int countProductionTasksByOperationId(@Param("operationId") String operationId);
} 